using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using MakeIT.Framework.Util;
using MakeIT.SGI.ERP.Entidades;
using MakeIT.SGI.ERP.Negocios;

namespace MakeIT.SGI.ERP.Apresentacao
{
	public partial class CadastroFilial : System.Web.UI.Page
	{

		UsuarioVO usuarioVO = null;
        protected SgiDAOT SgiDAOT = null;

        protected void Page_Load(object sender, EventArgs e)
        {
            this.SgiDAOT = new SgiDAOT();
			usuarioVO = (UsuarioVO)this.Session["userActive"];

			if (!IsPostBack)
			{
				Util.HabilitarCampos(false, this.panelCad);
			    atualizarDdlidEmpresa(null, null);

			}

		}

        protected void Page_Unload(object sender, EventArgs e)
        {
            try
            {
                if (this.SgiDAOT != null)
                    this.SgiDAOT.closeDAO();
            }
            catch (Exception ex) { }
        }

		protected void atualizarDdlidEmpresa(object sender, ImageClickEventArgs e)
		{
			List<EmpresaVO> idEmpresaCadVOs = new List<EmpresaVO>();
			idEmpresaCadVOs.AddRange(SgiDAOT.getEmpresas());
			this.ddlCadIdEmpresa.DataSource = idEmpresaCadVOs;
			this.ddlCadIdEmpresa.DataBind();

			EmpresaVO idEmpresaVO = EmpresaVO.CreateVO();
			idEmpresaVO.idEmpresa = -1;
			idEmpresaVO.empresa = "";
			List<EmpresaVO> idEmpresaVOs = new List<EmpresaVO>();
			idEmpresaVOs.Add(idEmpresaVO);
			idEmpresaVOs.AddRange(SgiDAOT.getEmpresas());
			this.ddlIdEmpresa.DataSource = idEmpresaVOs;
			this.ddlIdEmpresa.DataBind();

		}
		/// <summary>
		/// Manipula o evento do botão btnSalvar
		/// </summary>
		/// <param name="sender">Objeto disparador do evento</param>
		/// <param name="e">Argumento do evento</param>
		protected void btnSalvar_Click(object sender, EventArgs e)
		{

			//Declara objetos
			FilialVO filialVO = null;
			bool novoRegistro = false;

			try
			{
				//Verifica se o ID é nulo, se sim = cadastro novo
				if (string.IsNullOrEmpty(this.txtCadIdFilial.Text))
				{
					filialVO = FilialVO.CreateVO();
					filialVO.cadastro = DateTime.Now;
					filialVO.cadastradoPor = usuarioVO.user;

					novoRegistro = true;

				}
				//Recupera dados para serem alterados
				else
				{
					//Recupera dados
					filialVO = SgiDAOT.getFilial(Int32.Parse(this.txtCadIdFilial.Text));
				}

				filialVO.filial = this.txtCadFilial.Text;
				filialVO.idEmpresa = Int32.Parse(this.ddlCadIdEmpresa.SelectedValue);
				filialVO.matriz = this.ddlCadMatriz.SelectedValue.Equals("S");
				filialVO.edicao = DateTime.Now;
				filialVO.editadoPor = usuarioVO.user;

				//Chama metodo para salvar ou criar novo registro
				if (novoRegistro)
					filialVO.idFilial = (int)SgiDAOT.newFilial(filialVO);
				else
					SgiDAOT.setFilial(filialVO);

				// Exibe msg de sucesso ao salvar registro
				Util.ExibeAlert(this, "Registro salvo com sucesso!");

				//Popula grid atualizado
				this.btnPesquisa_Click(null, null);

				//Atualiza formulario, apos salvar os dados
				this.txtCadIdFilial.Text = filialVO.idFilial.ToString();
				this.ltCadastradoPor.Text = filialVO.cadastradoPor;
				this.ltEditadoPor.Text = filialVO.editadoPor;
				this.ltDataCadastro.Text = filialVO.cadastro.ToString("dd/MM/yyyy");
				this.ltDataEdicao.Text = filialVO.edicao.ToString("dd/MM/yyyy");

			}
			catch (Exception ex)
			{

				throw ex;
			}
		}

		/// <summary>
		/// Manipula o evento do botão btnPesquisa
		/// </summary>
		/// <param name="sender">Objeto disparador do evento</param>
		/// <param name="e">Argumento do evento</param>
		protected void btnPesquisa_Click(object sender, EventArgs e)
		{

			//Declara objetos
			int? idFilial = null;
			string filial = null;
			int? idEmpresa = null;

			try
			{

				if (!string.IsNullOrEmpty(this.txtIdFilial.Text))
				{
					idFilial = Int32.Parse(this.txtIdFilial.Text);
				}

				if (!string.IsNullOrEmpty(this.txtFilial.Text))
				{
					filial = this.txtFilial.Text;
				}

				if(!this.ddlIdEmpresa.SelectedValue.Equals("-1"))
				{
					idEmpresa = Int32.Parse(this.ddlIdEmpresa.SelectedValue);
				}


				//Recupera a lista de registros segundo a pesquisa
				this.grvResultado.DataSource = SgiDAOT.getFilials(idFilial, filial, idEmpresa);

				//Vincula os dados
				this.grvResultado.DataBind();
			}
			catch (Exception ex)
			{

				throw ex;
			}
		}

		/// <summary>
		/// Manipula o evento do botão btnCancelar
		/// </summary>
		/// <param name="sender">Objeto disparador do evento</param>
		/// <param name="e">Argumento do evento</param>
		protected void btnCancelar_Click(object sender, EventArgs e)
		{
			//Volta para a tab page de pesquisa
			//this.tabFilial.ActiveTabIndex = 0;

			// Desabilita os campos para edição
			Util.HabilitarCampos(false, this.panelCad);

			// Destrava botão de edição
			this.btnEditar.Enabled = (!string.IsNullOrEmpty(this.txtCadIdFilial.Text));

			// Destrava botão de exclusao
			this.btnExcluir.Enabled = (!string.IsNullOrEmpty(this.txtCadIdFilial.Text));

			// Detrava botão de novo
			this.btnNovo.Enabled = true;

			// Desabilita o botão salvar
			this.btnSalvar.Enabled = false;

		}

		protected void imgbVisualizar_Click(object sender, ImageClickEventArgs e)
		{
			// Declara objetos
			FilialVO filialVO = null;
			int idFilial = 0;

			try
			{
				//Recupera os argumentos com o ID do objeto
				string[] argumentos = ((ImageButton)sender).CommandArgument.Split(';');
				idFilial = Int32.Parse(argumentos[0]);

				//Recupera o objeto
				filialVO = SgiDAOT.getFilial(idFilial);

				this.txtCadIdFilial.Text = filialVO.idFilial.ToString();
				this.txtCadFilial.Text = filialVO.filial;
				this.ddlCadIdEmpresa.SelectedValue = filialVO.idEmpresa.ToString();
				this.ddlCadMatriz.SelectedValue = (filialVO.matriz==null?" ":(filialVO.matriz.Value?"S":"N"));
				this.ltCadastradoPor.Text = filialVO.cadastradoPor;
				this.ltEditadoPor.Text = filialVO.editadoPor;
				this.ltDataCadastro.Text = filialVO.cadastro.ToString("dd/MM/yyyy");
				this.ltDataEdicao.Text = filialVO.edicao.ToString("dd/MM/yyyy");

				//Habilita tab page do cadastro
				this.tabFilial.ActiveTabIndex = 1;

				//Desabilita campos para edição
				Util.HabilitarCampos(false, this.panelCad);

				//Desabilita botão salvar
				this.btnSalvar.Enabled = false;

				//Habilita botão editar
				this.btnEditar.Enabled = true;

				//Habilita botão excluir
				this.btnExcluir.Enabled = true;

				//Habilita botão novo
				this.btnNovo.Enabled = true;

			}
			catch (Exception ex)
			{

				throw ex;
			}
		}

		// <summary>
		// Manipula o evento editar do web form
		// </summary>
		// <param name="sender">Objeto disparador de evento</param>
		// <param name="e">Argumento do evento</param>
		protected void btnEditar_Click(object sender, EventArgs e)
		{
			// Habilita os campos para edição
			Util.HabilitarCampos(true, this.panelCad);

			// Trava apenas os text box da PK
			this.txtCadIdFilial.Enabled = false;

			// Trava botão de edição
			this.btnEditar.Enabled = false;

			// Trava botão de exclusao
			this.btnExcluir.Enabled = false;

			// Trava botão de novo
			this.btnNovo.Enabled = false;

			// Habilita o botão salvar
			this.btnSalvar.Enabled = true;

			this.txtCadFilial.Focus();
		}

		protected void btnNovo_Click(object sender, EventArgs e)
		{
			//Limpa formulario, para a entrada de novo registro
			Util.LimparCampos(this.panelCad);
			// Habilita os campos para edição
			Util.HabilitarCampos(true, this.panelCad);

			this.ltCadastradoPor.Text = "";
			this.ltEditadoPor.Text = "";
			this.ltDataCadastro.Text = "";
			this.ltDataEdicao.Text = "";

			// Trava apenas os text box da PK
			this.txtCadIdFilial.Enabled = false;

			// Trava botão de edição
			this.btnEditar.Enabled = false;

			// Trava botão de exclusao
			this.btnExcluir.Enabled = false;

			// Trava botão de novo
			this.btnNovo.Enabled = false;

			// Habilita o botão salvar
			this.btnSalvar.Enabled = true;

			this.txtCadFilial.Focus();

		}

		protected void btnExcluir_Click(object sender, EventArgs e)
		{
			//Declara objetos
			FilialVO filialVO = null;

			try
			{
				//Cria objeto
				filialVO = FilialVO.CreateVO();
				filialVO.idFilial = Int32.Parse(this.txtCadIdFilial.Text);

				//verifica se tem pessoa dependentes deste registro
				if (SgiDAOT.getCountPessoaxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Pessoas(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem cargo dependentes deste registro
				if (SgiDAOT.getCountCargoxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Cargo(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem depto dependentes deste registro
				if (SgiDAOT.getCountDeptoxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Departamento(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem perfil dependentes deste registro
				if (SgiDAOT.getCountPerfilxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Perfil(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem agenda dependentes deste registro
				if (SgiDAOT.getCountAgendaxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Agenda(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem agendatipo dependentes deste registro
				if (SgiDAOT.getCountAgendatipoxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Tipo de Agendamento(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem formapgto dependentes deste registro
				if (SgiDAOT.getCountFormapgtoxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Forma de Pagamento(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem ccusto dependentes deste registro
				if (SgiDAOT.getCountCcustoxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Centro de Custo(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem clucro dependentes deste registro
				if (SgiDAOT.getCountClucroxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Centro de Lucro(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem parcelamento dependentes deste registro
				if (SgiDAOT.getCountContratoxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Parcelamento(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem banco dependentes deste registro
				if (SgiDAOT.getCountBancoxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Banco(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem ctacor dependentes deste registro
				if (SgiDAOT.getCountCtacorxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Conta Corrente(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem caixatipo dependentes deste registro
				if (SgiDAOT.getCountCaixatipoxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Tipo de Caixa(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem caixa dependentes deste registro
				if (SgiDAOT.getCountCaixaxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Caixa(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem enderecotipo dependentes deste registro
				if (SgiDAOT.getCountEnderecotipoxIdFilial(filialVO.idFilial) > 0)
				{
					Util.ExibeAlert(this, "Há Tipo de Endereço(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

                //verifica se tem ticket dependentes deste registro
                if (SgiDAOT.getCountTicketfinxIdFilial(filialVO.idFilial) > 0)
                {
                    Util.ExibeAlert(this, "Há Tipo de Ticket(s) associado(s) a este registro. Exclusão não permitida");
                    return;
                }

				//Chama metodo para excluir registro
				SgiDAOT.delFilial(filialVO);

				// Exibe msg de sucesso ao salvar registro
				Util.ExibeAlert(this, "Registro excluido com sucesso!");

				//Popula grid atualizado
				this.btnPesquisa_Click(null, null);

				//Limpa formulario, apos salvar os dados
				Util.LimparCampos(this.panelCad);
				this.ltCadastradoPor.Text = "";
				this.ltEditadoPor.Text = "";
				this.ltDataCadastro.Text = "";
				this.ltDataEdicao.Text = "";

				// Trava botão de edição
				this.btnEditar.Enabled = false;

				// Trava botão de exclusao
				this.btnExcluir.Enabled = false;

				// Desabilita o botão salvar
				this.btnSalvar.Enabled = false;

				// Habilita o botao novo
				this.btnNovo.Enabled = true;

			}
			catch (Exception ex)
			{

				throw ex;
			}
			
		}

	}
}
